home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap16 / ShowDib5 / ShowDib5.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  6.6 KB  |  208 lines

  1. /*--------------------------------------------------
  2.    SHOWDIB5.C -- Displays DIB with halftone palette
  3.                  (c) Charles Petzold, 1998
  4.   --------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "..\\ShowDib3\\PackeDib.h"
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("ShowDib5") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HWND     hwnd ;
  18.      MSG      msg ;
  19.      WNDCLASS wndclass ;
  20.  
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.      wndclass.lpfnWndProc   = WndProc ;
  23.      wndclass.cbClsExtra    = 0 ;
  24.      wndclass.cbWndExtra    = 0 ;
  25.      wndclass.hInstance     = hInstance ;
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  29.      wndclass.lpszMenuName  = szAppName ;
  30.      wndclass.lpszClassName = szAppName ;
  31.  
  32.      if (!RegisterClass (&wndclass))
  33.      {
  34.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  35.                       szAppName, MB_ICONERROR) ;
  36.           return 0 ;
  37.      }
  38.  
  39.      hwnd = CreateWindow (szAppName, TEXT ("Show DIB #5: Halftone Palette"),
  40.                           WS_OVERLAPPEDWINDOW,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, iCmdShow) ;
  46.      UpdateWindow (hwnd) ;
  47.  
  48.      while (GetMessage (&msg, NULL, 0, 0))
  49.      {
  50.           TranslateMessage (&msg) ;
  51.           DispatchMessage (&msg) ;
  52.      }
  53.      return msg.wParam ;
  54. }
  55.  
  56. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  57. {
  58.      static BITMAPINFO * pPackedDib ;
  59.      static HPALETTE     hPalette ;
  60.      static int          cxClient, cyClient ;
  61.      static OPENFILENAME ofn ;
  62.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  63.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  64.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  65.      HDC                 hdc ;
  66.      PAINTSTRUCT         ps ;
  67.  
  68.      switch (message)
  69.      {
  70.      case WM_CREATE:
  71.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  72.           ofn.hwndOwner         = hwnd ;
  73.           ofn.hInstance         = NULL ;
  74.           ofn.lpstrFilter       = szFilter ;
  75.           ofn.lpstrCustomFilter = NULL ;
  76.           ofn.nMaxCustFilter    = 0 ;
  77.           ofn.nFilterIndex      = 0 ;
  78.           ofn.lpstrFile         = szFileName ;
  79.           ofn.nMaxFile          = MAX_PATH ;
  80.           ofn.lpstrFileTitle    = szTitleName ;
  81.           ofn.nMaxFileTitle     = MAX_PATH ;
  82.           ofn.lpstrInitialDir   = NULL ;
  83.           ofn.lpstrTitle        = NULL ;
  84.           ofn.Flags             = 0 ;
  85.           ofn.nFileOffset       = 0 ;
  86.           ofn.nFileExtension    = 0 ;
  87.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  88.           ofn.lCustData         = 0 ;
  89.           ofn.lpfnHook          = NULL ;
  90.           ofn.lpTemplateName    = NULL ;
  91.  
  92.                // Create the All-Purpose Palette
  93.  
  94.           hdc = GetDC (hwnd) ;
  95.           hPalette = CreateHalftonePalette (hdc) ;
  96.           ReleaseDC (hwnd, hdc) ;
  97.           return 0 ;
  98.  
  99.      case WM_SIZE:
  100.           cxClient = LOWORD (lParam) ;
  101.           cyClient = HIWORD (lParam) ;
  102.           return 0 ;
  103.  
  104.      case WM_COMMAND:
  105.           switch (LOWORD (wParam))
  106.           {
  107.           case IDM_FILE_OPEN:
  108.  
  109.                     // Show the File Open dialog box
  110.  
  111.                if (!GetOpenFileName (&ofn))
  112.                     return 0 ;
  113.                
  114.                     // If there's an existing packed DIB, free the memory
  115.  
  116.                if (pPackedDib)
  117.                {
  118.                     free (pPackedDib) ;
  119.                     pPackedDib = NULL ;
  120.                }
  121.                
  122.                     // Load the packed DIB into memory
  123.  
  124.                SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  125.                ShowCursor (TRUE) ;
  126.  
  127.                pPackedDib = PackedDibLoad (szFileName) ;
  128.  
  129.                ShowCursor (FALSE) ;
  130.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  131.  
  132.                if (!pPackedDib)
  133.                {
  134.                     MessageBox (hwnd, TEXT ("Cannot load DIB file"), 
  135.                                 szAppName, 0) ;
  136.                }
  137.                InvalidateRect (hwnd, NULL, TRUE) ;
  138.                return 0 ;
  139.           }
  140.           break ;
  141.  
  142.      case WM_PAINT:
  143.           hdc = BeginPaint (hwnd, &ps) ;
  144.  
  145.           if (pPackedDib)
  146.           {
  147.                     // Set halftone stretch mode
  148.  
  149.                SetStretchBltMode (hdc, HALFTONE) ;
  150.                SetBrushOrgEx (hdc, 0, 0, NULL) ;
  151.  
  152.                     // Select and realize halftone palette
  153.  
  154.                SelectPalette (hdc, hPalette, FALSE) ;
  155.                RealizePalette (hdc) ;
  156.  
  157.                     // StretchDIBits rather than SetDIBitsToDevice
  158.           
  159.                StretchDIBits (hdc, 
  160.                               0,   
  161.                               0,   
  162.                               PackedDibGetWidth (pPackedDib), 
  163.                               PackedDibGetHeight (pPackedDib),
  164.                               0,                            
  165.                               0,                            
  166.                               PackedDibGetWidth (pPackedDib),
  167.                               PackedDibGetHeight (pPackedDib),  
  168.                               PackedDibGetBitsPtr (pPackedDib), 
  169.                               pPackedDib, 
  170.                               DIB_RGB_COLORS, 
  171.                               SRCCOPY) ;
  172.           }
  173.           EndPaint (hwnd, &ps) ;
  174.           return 0 ;
  175.  
  176.      case WM_QUERYNEWPALETTE:
  177.           hdc = GetDC (hwnd) ;
  178.           SelectPalette (hdc, hPalette, FALSE) ;
  179.           RealizePalette (hdc) ;
  180.           InvalidateRect (hwnd, NULL, TRUE) ;
  181.  
  182.           ReleaseDC (hwnd, hdc) ;
  183.           return TRUE ;
  184.  
  185.      case WM_PALETTECHANGED:
  186.           if ((HWND) wParam != hwnd)
  187.  
  188.           hdc = GetDC (hwnd) ;
  189.           SelectPalette (hdc, hPalette, FALSE) ;
  190.           RealizePalette (hdc) ;
  191.           UpdateColors (hdc) ;
  192.  
  193.           ReleaseDC (hwnd, hdc) ;
  194.           break ;
  195.           
  196.      case WM_DESTROY:
  197.           if (pPackedDib)
  198.                free (pPackedDib) ;
  199.  
  200.           DeleteObject (hPalette) ;
  201.  
  202.           PostQuitMessage (0) ;
  203.           return 0 ;
  204.      }
  205.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  206. }
  207.  
  208.